/*
 * 2005-06-12
 * Code source inspir? et traduit ? partir d'un ?nonc? de laboratoire du MIT
 * 6.170  	Laboratory in Software Engineering, Fall 2002
 * http://6170.lcs.mit.edu/www-archive/Old-2002-Fall/psets/ps2/ps2.html
 */

// 2005-11-9 cpf mise ? jour pour Java 1.5 et types "generics"

package cartes;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * Repr?sente une valeur d'une carte, parmi 13 valeurs possibles : 
 * (ex.: valet, huit, as)
 */
public final class Denomination implements Comparable<Denomination> {


    //
    // CONSTANTES
    //

    // les 13 Denominations legales

    /**
     * La Denomination de carte repr?sentant le 2.
     */
    public static final Denomination DEUX   = new Denomination("deux",   "2");

    /**
     * La Denomination de carte repr?sentant le 3.
     */
    public static final Denomination TROIS = new Denomination("trois", "3");

    /**
     * La Denomination de carte repr?sentant le 4.
     */
    public static final Denomination QUATRE  = new Denomination("quatre",  "4");

    /**
     * La Denomination de carte repr?sentant le 5.
     */
    public static final Denomination CINQ  = new Denomination("cinq",  "5");

    /**
     * La Denomination de carte repr?sentant le 6.
     */
    public static final Denomination SIX   = new Denomination("six",   "6");

    /**
     * La Denomination de carte repr?sentant le 7.
     */
    public static final Denomination SEPT = new Denomination("sept", "7");

    /**
     * La Denomination de carte repr?sentant le 8.
     */
    public static final Denomination HUIT = new Denomination("huit", "8");

    /**
     * La Denomination de carte repr?sentant le 9.
     */
    public static final Denomination NEUF  = new Denomination("neuf",  "9");

    /**
     * La Denomination de carte repr?sentant le 10.
     */
    public static final Denomination DIX   = new Denomination("dix",   "10");

    /**
     * La Denomination de carte repr?sentant le valet.
     */
    public static final Denomination VALET  = new Denomination("valet",  "V");

    /**
     * La Denomination de carte repr?sentant la dame.
     */
    public static final Denomination DAME = new Denomination("dame", "D");

    /**
     * La Denomination de carte repr?sentant le roi.
     */
    public static final Denomination ROI  = new Denomination("roi",  "R");

    /**
     * La Denomination de carte repr?sentant l'as.
     */
    public static final Denomination AS   = new Denomination("as",   "A");



    // Rang des Denominations

    /**
     * Une liste des Denominations en ordre croissant
     */
    public static final List DenominationS = 
        Collections.unmodifiableList(Arrays.asList(new Denomination[] {
            DEUX, TROIS, QUATRE, CINQ, SIX, SEPT, HUIT, NEUF, DIX, VALET, DAME, ROI, AS
        }));

    //
    // M?THODES
    //

    //-------------------------------------------
    /**
     * Cr?e une nouvelle Denomination
     *
     * @param nom  the name of this value
     * @param caract?reSurCarte     le symbole repr?sentant cette carte
     *
     */
    private Denomination(String nom, String caractereSurCarte) {
		this.nom = nom;
        this.caractereSurCarte = caractereSurCarte;
    }


    //-------------------------------------------
    /**
     * Retourne le nom de cette Denomination
     * <p>
     * Par exemple "2", "3", ..., "10", "valet", "dame", "roi", ou "as".
     *
     * @return le nom de cette Denomination
     */
    public String getNom() {
        return nom;
    }


	//-------------------------------------------
    /**
     * Retourne le symbole repr?sentant cette Denomination
     * <p>
     * Par exemple, "2", "3", ..., "10", "V", "D", "R", ou "A"
     * 
	 * @return le symbole repr?sentant cette Denomination
	 */
    public String caractereSurCarte() { 
        return caractereSurCarte;
    }


    //-------------------------------------------
    /**
     * Compare cette Denomination ? la Denomination sp?cifi?e pour d?terminer l'ordre
     *
     * @param o  l'objet qui sera compar?
     * @return   un entier n?gatif, z?ro ou un entier positif, selon si
     *           cette Denomination est inf?rieure, ?gal ou sup?rieure ?
     * 			 l'objet sp?cifi?.
     * @exception ClassCastException si l'objet sp?cifi? n'a pas le type Denomination
     * @exception NullPointerException si l'objet sp?cifi? est null
     *
     */
    public int compareTo(Denomination o)
    {        
        if (o == null) 
        {
            throw new NullPointerException();
        }
        

        return DenominationS.indexOf(this) - DenominationS.indexOf((Denomination)o);
    }
	

    //-------------------------------------------
    /**
     * Retourne une description de cette Denomination.
     *
     * @return une description de cette Denomination
     *
     */
    public String toString() { 
        return getNom(); 
    }

	//
	// VARIABLES MEMBRES
	//

	/**
	 * Le nom de cette Denomination
	 */
	private final String nom;

	/**
	 * Le symbole apparaissant sur la carte 
	 */
	private final String caractereSurCarte;


}
